﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

//int main()
//{
//	char a = 128;
//	//
//	//00000000000000000000000010000000——原码
//	//10000000 - char a
//	//11111111111111111111111110000000——整形提升
//	//
//	printf("%d\n", a);
//
//	return 0;
//}
//

//int main()
//{
//	int i = -20;
//	//10000000000000000000000000010100——原码
//	//11111111111111111111111111101011——反码
//	//11111111111111111111111111101100——补码
//	//
//	unsigned int j = 10;
//	//00000000000000000000000000001010——原码
//
//	printf("%d\n", i + j);
//	//11111111111111111111111111101100
//	//00000000000000000000000000001010
//	//11111111111111111111111111110110——补码
//	//11111111111111111111111111110101——反码
//	//10000000000000000000000000001010——原码： -10
//	//
//
//	return 0;
//}

//#include<windows.h>
//int main()
//{
//	unsigned int i;//永远大于0；
//	for (i = 9; i >= 0; i--)
//	{
//		printf("%u\n", i);	 
//		Sleep(1000);
//	}
//
//	return 0;
//}

//#include<string.h>
//int main()
//{
//	//-128~127
//	//
//	char a[1000];
//	//0~127
//	//-1 -2 -3 -4 ...-128 127 126 ... 5 4 3 2 1 0 -1 -2 ...
//	int i;
//	for (i = 0; i < 130; i++)
//	{
//		a[i] = -1 - i;
//	}
//	printf("%d\n", a[127]);
//	printf("%d\n", a[128]);
//	//-128
//	// 10000000 00000000 00000000 10000000——原码
//	// 11111111 11111111 11111111 01111111——反码
//	// 11111111 11111111 11111111 10000000——补码
//	// 11111111 11111111 11111111 01111111—— -128-1
//	// 因为只能取前八位
//	//得到01111111——127
//	printf("%d\n", a[129]);
//	//printf("%d", strlen(a));   //255
//
//	return 0;
//}
////

//#include <stdio.h>
//
////0~255
//unsigned char i = 0;
//
//int main()
//{
//	for (i = 0; i <= 255; i++)
//	{
//		printf("hello world\n");
//	}
//	return 0;
//}
//
//
//int main()
//{
//	int n = 9;
//	//00000000 00000000 00000000 00001001——9的补码
//	float* pFloat = (float*)&n;	
//
//	printf("n的值为：%d\n", n);
//	printf("*pFloat的值为：%f\n", *pFloat);//这时以浮点数看二进制位
//	//0		00000000	00000000000000000001001
//	//S		E			M
//	//这是E位全零
//	//(-1)^0 * 0.00000000000000000001001 * 2^-126
//	//就几乎为0了
//	//所以打印0.0000
//
//	*pFloat = 9.0;
//	//9.0
//	//1001.0
//	//1.001*2^3
//	//(-1)^0 * 1.001 *2^3
//	//0		10000010		00100000000000000000000
//	//S		E				M
//
//	printf("num的值为：%d\n", n);
//	//以整数形式往出拿：就是01000001000100000000000000000000
//	//算后得到：1091567616
//
//	printf("*pFloat的值为：%f\n", *pFloat);
//	//按正常浮点数取，就得到9.0
//
//	return 0;
//}

//int main()
//{
//	float f = 5.5f;
//	//(-1)^0 * 1.011 * 2^2
//	//S = 0
//	//M = 1.011
//	//E = 2   2+127=129 
//	//0  10000001  01100000000000000000000
//	//S	 E		   M
//	//40 b0 00 00
//	//
//	return 0;
//}

//int main()
//{
//    const char* pstr = "hello world.";//这里是把一个字符串放到pstr指针变量里了吗？
//    printf("%s\n", pstr);
//    return 0;
//}

//int main()
//{
//    char str1[] = "hello world";
//    char str2[] = "hello world";
//    const char* str3 = "hello world";
//    const char* str4 = "hello world";
//    if (str1 == str2)
//        printf("str1 and str2 are same\n");
//    else
//        printf("str1 and str2 are not same\n");
//
//    if (str3 == str4)
//        printf("str3 and str4 are same\n");
//    else
//        printf("str3 and str4 are not same\n");
//
//    return 0;
//}

//int main()
//{
//	//const char* arr[5] = {"abcdef", "zhangsan", "hehe", "wangcai", "ruhua"};//存放指针的数组 - 指针数组
//	//int i = 0;
//	//for (i = 0; i < 5; i++)
//	//{
//	//	printf("%s\n", arr[i]);
//	//}
//
//	int arr1[5] = { 1,2,3,4,5 };
//	int arr2[5] = { 2,3,4,5,6 };
//	int arr3[5] = { 3,4,5,6,7 };
//
//	int* arr[3] = {arr1, arr2, arr3};
//
//	int i = 0;
//	int j = 0;
//	for (i = 0; i < 3; i++)
//	{
//		for (j = 0; j < 5; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//
//	int* arr1[10]; //整形指针的数组
//	char* arr2[4]; //一级字符指针的数组
//	char** arr3[5];//二级字符指针的数组
//
//	return 0;
//}

//整型指针 - 指向整型的指针  - 存放整型变量的地址
//int* p1;
//字符指针 - 指向字符的指针  - 存放字符变量的地址
//char* p2;
//数组指针 - 指向数组的指针  - 存放的是数组的地址

//int main()
//{
//	int a = 10;
//	int* p1 = &a;
//	//整型指针 - 指向整型的指针  - 存放整型变量的地址
//
//	char ch = 'w';
//	char* p2 = &ch;
//	//字符指针 - 指向字符的指针  - 存放字符变量的地址
//
//	int arr[10] = {1,2,3,4,5};
//	//int *pa[10] = &arr;//err，因为pa会先和[10]结合
//	int (* pa)[10] = &arr;
//	//取出的是数组的地址存放到pa中，pa是数组指针变量
//	//int(* )[10] -> 数组指针类型
//	//数组指针 - 指向数组的指针  - 存放的是数组的地址
//
//	return 0;
//}

//数组名是数组首元素的地址
//有2个例外：
//1. sizeof(数组名)
//2. &数组名

int main()
{
	int arr[10] = {0};
	printf("%p\n", arr);
	printf("%p\n", arr+1);

	printf("%p\n", &arr[0]);
	printf("%p\n", &arr[0]+1);

	printf("%p\n", &arr);
	printf("%p\n", &arr+1);

	return 0;
}